home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_asm / m6809 / assist09.asm < prev   
Assembly Source File  |  1986-11-26  |  57KB  |  1,837 lines

  1.  ttl assist09 - mc6809 monitor
  2.  
  3. *  Modification date:  March 4, 1985
  4.    
  5. *************************************
  6. * copyright (c) motorola, inc. 1979 *
  7. *************************************
  8.    
  9. *************************************
  10. *  This version of assist09 contains modifications
  11. *  which allow a mc68681 duart to be used in place 
  12. *  of the mc6850 acia and mc6840 ptm, while also
  13. *  providing software controlled baud rate.
  14. *  several options (opt) are used to generate
  15. *  printouts of the modified sections only.
  16. *************************************
  17.    
  18. *********************************************
  19. *         global module    equates
  20. ********************************************
  21.  
  22. rombeg    equ    $f800        rom start assembly address
  23. ramofs    equ    -$3800        rom offset to ram work page
  24. romsiz    equ    2048        rom size
  25. rom2of    equ    rombeg-romsiz    start of extension rom
  26. duart    equ    $8010        default acia address
  27. ptm    equ    $8020        default dumb address
  28.  
  29. * refer to table below in miscellaneous    equates
  30. * section for modificatiuons of baud rate
  31.  
  32. mbaud    equ    $02bb        byte1 is mode byte2 is baud rate
  33. dftchp    equ    0        default character pad count
  34. dftnlp    equ    5        default new line pad count
  35. prompt    equ    '>        prompt character
  36. numbkp    equ    8        number of breakpoints
  37.  
  38. *********************************************
  39. *  miscelaneous    equates
  40. *********************************************
  41.  
  42. eot    equ    $04        end of transmission
  43. bell    equ    $07        bell character
  44. lf    equ    $0a        line feed
  45. cr    equ    $0d        carriage return
  46. dle    equ    $10        data link escape
  47. can    equ    $18        cancel (ctl-x)
  48.  
  49. * duart access definitions
  50.  
  51. mr1a    equ    $00        mode register 1 port a
  52. mr2a    equ    $00        mode register 2 port a
  53. csra    equ    $01        clock select register
  54. trans    equ    $03        transmit buffer
  55. reciv    equ    $03        receiver buffer
  56. acr    equ    $04        auxillery control
  57. cra    equ    $02        command register a
  58. stat    equ    $01        status register a
  59. scc    equ    $0e        start counter command
  60. stop    equ    duart+$0f
  61. imr    equ    $05
  62. ctur    equ    $06
  63.  
  64. *
  65. * baud rate select table for
  66. * some common selections for 
  67. * baud rate set #2 on mc68681 
  68. *
  69. *    300 baud = $44
  70. *   1200 baud = $66
  71. *   2400 baud = $88
  72. *   4800 baud = $99
  73. *   9600 baud = $bb
  74. *  19.2k baud = $cc
  75.     
  76. skip2    equ    $8c        "cmpx #" opcode - skips two byte
  77.    
  78. *******************************************
  79. *    assist09 monitor swi functions
  80. * the following    equates define functions provided
  81. * by the assist09 monitor via the swi instruction.
  82. ******************************************
  83.  
  84. inchnp    equ    0        input char in a reg - no parity
  85. outch    equ    1        output char from a reg
  86. pdata1    equ    2        output string 
  87. pdata    equ    3        output cr/lf then string
  88. out2hs    equ    4        output two hex and space
  89. out4hs    equ    5        output four hex and space
  90. pcrlf    equ    6        output cr/lf
  91. space    equ    7        output a space
  92. monitr    equ    8        enter assist09 monitor
  93. vctrsw    equ    9        vector examine/switch
  94. brkpt    equ    10        user program breakpoint
  95. pause    equ    11        task pause function
  96. numfun    equ    11        number of available functions
  97.  
  98. * next sub-codes for accessing the vector table.
  99. * they are    equivalent to offsets in the table.
  100. * relative positioning must be maintained.
  101.  
  102. .avtbl    equ    0        address of vector table
  103. .cmdl1    equ    2        first command list
  104. .rsvd    equ    4        reserved hardware vector
  105. .swi3    equ    6        swi3 routine
  106. .swi2    equ    8        swi2 routine
  107. .firq    equ    10        firq routine
  108. .irq    equ    12        irq routine
  109. .swi    equ    14        swi routine
  110. .nmi    equ    16        nmi routine
  111. .reset    equ    18        reset routine
  112. .cion    equ    20        console on
  113. .cidta    equ    22        console input data
  114. .cioff    equ    24        console input off
  115. .coon    equ    26        console output on
  116. .codta    equ    28        console output data
  117. .cooff    equ    30        console output off
  118. .hsdta    equ    32        high speed printdata
  119. .bson    equ    34        punch/load on
  120. .bsdta    equ    36        punch/load data
  121. .bsoff    equ    38        punch/load off
  122. .pause    equ    40        task pause routine
  123. .expan    equ    42        expression analyzer
  124. .cmdl2    equ    44        second command list
  125. .duart    equ    46        duart address
  126. .pad    equ    48        character pad and new line pad
  127. .echo    equ    50        echo/load and null bkpt flag
  128. .ptm    equ    52        ptm not really used
  129.  
  130. * ptm    equate was deleted due to implementation
  131. * of trace by the timer/counter on the mc68681
  132.  
  133. numvtr    equ    52/2+1        number of vectors
  134. hivtr    equ    52        highest vector offset
  135.  
  136. ******************************************
  137. *              work area
  138. * This work area is assigned to the page addressed by
  139. * -$800, pcr from the base address of the assist09
  140. * rom.  the direct page register during most routine
  141. * operations will point to this work area.  the Stack
  142. * initially starts under the reserved work areas as
  143. * defined herein.
  144. ******************************************
  145.  
  146. workpg    equ    rombeg+ramofs    setup direct page address
  147.  
  148. * setdp workpg!>8 notify assembler
  149.  
  150.     org    workpg+256    ready page definitions
  151.  
  152. * the following thru bkptop must reside in this order
  153. * for proper initialization
  154.  
  155.     org    *-4
  156. pauser    equ    *        pause routine
  157.     org    *-1
  158. swibfl    equ    *        bypass swi as breakpoint flag
  159.     org    *-1
  160. bkptct    equ    *        breakpoint count
  161.     org    *-2
  162. slevel    equ    *        stack trace level
  163.     org    *-$36 
  164. vectab    equ    *        vector table
  165.     org    *-$10
  166. bkptbl    equ    *        breakpoint table
  167.     org    *-$10
  168. bkptop    equ    *        breakpoint opcode table
  169.     org    *-2       
  170. window    equ    *        window 
  171.     org    *-2
  172. addr    equ    *        address pointer value
  173.     org    *-1
  174. basepg    equ    *        base page value
  175.     org    *-2
  176. number    equ    *        binary build area
  177.     org    *-2
  178. lastop    equ    *        last opcode traced
  179.     org    *-2
  180. rstack    equ    *        reset stack pointer
  181.     org    *-2
  182. pstack    equ    *        command recovery stack
  183.     org    *-2 
  184. pcnter    equ    *        last program counter
  185.     org    *-2
  186. tracec    equ    *        trace count
  187.     org    *-1
  188. swicnt    equ    *        trace "swi" nest level count
  189.     org    *-1        (misflg must follow swicnt)
  190. misflg    equ    *        load cmd/thru breakpoint flag
  191.     org    *-1
  192. delim    equ    *        expression delimiter/work byte
  193.     org    *-40
  194. rom2wk    equ    *        extension rom reserved area
  195.     org    *-21
  196. tstack    equ    *        temporary stack hold
  197. stack    equ    *        start of initial stack
  198.    
  199. ******************************************
  200. * default the rom beginning address to 'rombeg'
  201. * assist09 is position address independent, however
  202. * we assemble assuming control of the hardware vectors.
  203. * note that the work ram page must be 'ramofs'
  204. * from the rom beginning address.
  205. ********************************************
  206.  
  207.     org    rombeg        rom assembly/default address
  208.    
  209. *****************************************************
  210. *            bldvtr - build assist09 vector table
  211. *  hardware reset calls this subroutine to build the
  212. *  assist09 vector table.  this subroutine resides at
  213. *  the first byte of the assist09 rom, and can be
  214. *  called via external control code for remote
  215. *  assist09 execution.
  216. * input: s->valid stack ram
  217. * output: u->vector table address
  218. *         dpr->assist09 work area page
  219. *         the vector table and defaults are initialized
  220. *  all registers volatile
  221. *************************************************
  222.     
  223. bldvtr    leax    vectab,pcr    address vector table
  224.     tfr    x,d        obtain base page address
  225.     tfr    a,dp        setup dpr
  226.     sta    <basepg        store for quick reference
  227.     leau    ,x        return table to caller
  228.     leay    <initvt,pcr    load from addr
  229.     stu    ,x++        init vector table address
  230.     ldb    #numvtr-5    number relocatable vectors
  231.     pshs    b        store index on stack
  232. bld2    tfr    y,d        prepare address resolve
  233.     addd    ,y++        to absolute address
  234.     std    ,x++        into vector table
  235.     dec    ,s        count down
  236.     bne    bld2        branch if more to insert
  237.     ldb    #intve-intvs    static value init length
  238. bld3    lda    ,y+        load next byte
  239.     sta    ,x+        store into position
  240.     decb            count down
  241.     bne    bld3        loop until done
  242.     leay    rom2of,pcr    test possible extension rom
  243.     ldx    #$20fe        load "bra *" flag pattern
  244.     cmpx    ,y++        ? extended rom here
  245.     bne    bldrtn        branch not our rom to return
  246.     jsr    ,y        call extended rom initialize
  247. bldrtn    puls    pc,b        return to initializer
  248.    
  249. *****************************************************
  250. *                 reset entry point
  251. *  hardware reset enters here if assist09 is enabled
  252. *  to receive the mc6809 hardware vectors.  we call
  253. *  the bldvtr subroutine to initialize the vector
  254. *  table, stack, and then fireup the monitor via swi
  255. *  call.
  256. *******************************************************
  257. reset    leas    stack,pcr    setup initial stack
  258.     bsr    bldvtr        build vector table
  259. reset2    clra            issue startup message
  260.     tfr    a,dp        default to page zero
  261.     swi            perform monitor fireup
  262.     fcb    monitr        to enter command processing
  263.     bra    reset2        reenter monitor if 'continue'
  264.       
  265. ******************************************************
  266. *         initvt - initial vector table
  267. *  this table is relocated to ram and represents the
  268. *  initial state of the vector table. all addresses
  269. *  are converted to absolute form.  this table starts
  270. *  with the second entry, ends with static constant
  271. *  initialization data which carries beyond the table.
  272. ************************************************
  273.  
  274. initvt    fdb    cmdtbl-*    default first command table
  275.     fdb    rsrvdr-*    default undefined hardware vector
  276.     fdb    swi3r-*        default swi3
  277.     fdb    swi2r-*        default swi2
  278.     fdb    firqr-*        default firq
  279.     fdb    irqr-*        default irq routine
  280.     fdb    swir-*        default swi routine
  281.     fdb    nmir-*        default nmi routine
  282.     fdb    reset-*        restart vector
  283.     fdb    cion-*        default cion
  284.     fdb    cidta-*        default cidta
  285.     fdb    cioff-*        default cioff
  286.     fdb    coon-*        default coon
  287.     fdb    codta-*        default codta
  288.     fdb    cooff-*        default cooff
  289.     fdb    hsdta-*        default hsdta
  290.     fdb    bson-*        default bson
  291.     fdb    bsdta-*        default bsdta
  292.     fdb    bsoff-*        default bsoff
  293.     fdb    pauser-*    default pause routine
  294.     fdb    exp1-*        default expression analyzer
  295.     fdb    cmdtb2-*    default second command table
  296. * constants
  297. *
  298. intvs    fdb    duart        default duart
  299. *
  300.     fcb    dftchp,dftnlp    default null padds
  301.     fdb    0        default echo
  302.     fdb    ptm        not really used
  303. *
  304. * ptm rmb was deleted from here
  305. * since it was no longer needed
  306. *
  307.     fdb    0        initial stack trace level
  308.     fcb    0        initial breakpoint count
  309.     fcb    0        swi breakpoint level
  310.     fcb    $39        default pause routine (rts)
  311. intve    equ    * 
  312. *b
  313.    
  314. ***********************************************
  315. *             assist09 swi handler
  316. *  the swi handler provides all interfacing necessary
  317. *  for a user program.  a function byte is assumed to
  318. *  follow the swi instruction.  it is bound checked
  319. *  and the proper routine is given control.  this
  320. *  invocation may also be a breakpoint interrupt.
  321. *  if so, the breakpoint handler is entered.
  322. * input: machine state defined for swi
  323. * output: varies according to function called. pc on
  324. *     callers stack incremented by one if valid call.
  325. * volatile registers: see functions called
  326. * state: runs disabled unless function clears i flag.
  327. ************************************************
  328.     
  329. * swi function vector table
  330. swivtb    fdb     zinch-swivtb    inchnp
  331.     fdb    zotch1-swivtb    outch
  332.     fdb    zpdta1-swivtb    pdata1
  333.     fdb    zpdata-swivtb    pdata
  334.     fdb    zot2hs-swivtb    out2hs
  335.     fdb    zot4hs-swivtb    out4hs
  336.     fdb    zpcrlf-swivtb    pcrlf
  337.     fdb    zspace-swivtb    space
  338.     fdb    zmontr-swivtb    monitr
  339.     fdb    zvswth-swivtb    vctrsw
  340.     fdb    zbkpnt-swivtb    breakpoint
  341.     fdb    zpause-swivtb    task pause
  342.    
  343. swir    dec    swicnt,pcr    up "swi" level for trace
  344.     lbsr    lddp        setup page and verify stack
  345. * check for breakpoint trap
  346.     ldu    10,s        load program counter
  347.     leau    -1,u        back to swi address
  348.     tst    <swibfl        ? this "swi" breakpoint
  349.     bne    swidne        branch if so to let through
  350.     lbsr    cbkldr        obtain breakpoint pointers
  351.     negb    obtain        positive count
  352. swilp    decb    count        down
  353.     bmi    swidne        branch when done
  354.     cmpu    ,y++        ?  was this a breakpoint
  355.     bne    swilp        branch if not
  356.     stu    10,s        set program counter back
  357.     lbra    zbkpnt        go do breakpoint    
  358. swidne    clr    <swibfl        clear in case set
  359.     pulu    d        obtain function byte, up pc
  360.     cmpb    #numfun        ? too high
  361.     lbhi    error        yes, do breakpoint
  362.     stu    10,s        bump program counter past swi
  363.     aslb            function code times two
  364.     leau            swivtb,pcr obtain vector branch address
  365.     ldd    b,u        load offset
  366.     jmp    d,u        jump to routine
  367.     
  368. **********************************************
  369. * registers to function routines:
  370. *  dp-> work area page
  371. *  d,y,u=unreliable           x=as called from user
  372. *  s=as from swi interrupt
  373. *********************************************
  374.    
  375. **************************************************
  376. *            [swi function 8]
  377. *              monitor entry
  378. *  fireup the assist09 monitor.
  379. *  the stack with its values for the direct page
  380. *  register and condition code flags are used as is.
  381. *   1) initialize console i/o
  382. *   2) optionally print signon
  383. *   3) initialize ptm for single stepping
  384. *   4) enter command processor
  385. * input: a=0 init console and print startup message 
  386. *        a#0 omit console init and startup message      
  387. *************************************************
  388.     
  389. signon  fcc    /assist09/    signon eye-catcher
  390.     fcb    eot
  391.     
  392. zmontr    sts    <rstack        save for bad stack recovery
  393.     tst    1,s        ? init console and send msg
  394.     bne    zmont2        branch if not
  395.     jsr    [vectab+.cion,pcr] ready console input
  396.     jsr    [vectab+.coon,pcr] ready console output
  397.     leax    signon,pcr    ready signon eye-catcher
  398.     swi    perform
  399.     fcb    pdata        print string
  400. *
  401. * ptm initialization deleted
  402. *
  403. zmont2    bra    cmd
  404. *
  405.    
  406. ***************************************************
  407. *          command handler
  408. *  breakpoints are removed at this time.
  409. *  prompt for a command, and store all characters
  410. *  until a separator on the stack.
  411. *  search for first matching command subset,
  412. *  call it or give '?' response.
  413. *  during command search:
  414. *      b=offset to next entry on x
  415. *      u=saved s
  416. *      u-1=entry size+2
  417. *      u-2=valid number flag (>=0 valid)/compare cnt
  418. *      u-3=carriage return flag (0=cr has been done)
  419. *      u-4=start of command store
  420. *      s+0=end of command store
  421. ***********************************************
  422.  
  423. cmd    swi            to new line
  424.     fcb    pcrlf        function
  425. * disarm the breakpoints
  426. cmdnep    lbsr    cbkldr        obtain breakpoint pointers
  427.     bpl    cmdnol        branch if not armed or none
  428.     negb            make positive
  429.     stb    <bkptct        flag as disarmed
  430. cmdddl    decb            ?  finished
  431.     bmi    cmdnol        branch if so
  432.     lda    -numbkp*2,y    load opcode stored
  433.     sta    [,y++]        store back over "swi"
  434.     bra    cmdddl        loop until done
  435. cmdnol    ldx    10,s        load users program counter
  436.     stx    <pcnter        save for expression analyzer
  437.     lda    #prompt        load prompt character
  438.     swi            send to output handler
  439.     fcb    outch        function
  440.     leau    ,s        remember stack restore address
  441.     stu    <pstack        remember stack for error use
  442.     clra            prepare zero
  443.     clrb            prepare zero
  444.     std    <number        clear number build area
  445.     std    <misflg        clear miscel. and swicnt flags
  446.     std    <tracec        clear trace count
  447.     ldb    #2         set d to two
  448.     pshs    d,cc        place defaults onto stack
  449. * check for "quick" commands.
  450.     lbsr    read        obtain first character
  451.     leax    cdot+2,pcr    preset for single trace
  452.     cmpa    #'.        ? quick trace
  453.     beq    cmdxqt        branch    equal for trace one
  454.     leax    cmpadp+2,pcr    ready memory entry point
  455.     cmpa    #'/        ? open last used memory
  456.     beq    cmdxqt        branch to do it if so
  457. * process next character
  458. cmd2    cmpa    #'         ? blank or delimiter
  459.     bls    cmdgot        branch yes, we have it
  460.     pshs            a build onto stack
  461.     inc    -1,u        count this character
  462.     cmpa    #'/        ? memory command
  463.     beq    cmdmem        branch if so
  464.     lbsr    bldhxc        treat as hex value
  465.     beq    cmd3        branch if still valid number
  466.     dec    -2,u        flag as invalid number
  467. cmd3    lbsr    read        obtain next character
  468.     bra    cmd2        test next character
  469. * got command, now search tables
  470. cmdgot    suba    #cr        set zero if carriage return
  471.     sta    -3,u        setup flag
  472.     ldx    <vectab+.cmdl1    start with first cmd list
  473. cmdsch    ldb    ,x+        load entry length
  474.     bpl    cmdsme        branch if not list end
  475.     ldx    <vectab+.cmdl2    now to second cmd list
  476.     incb            ? to continue to default list
  477.     beq    cmdsch        branch if so
  478. cmdbad    lds    <pstack        restore stack
  479.     leax    errmsg,pcr    point to error string
  480.     swi            send out
  481.     fcb    pdata1        to console
  482.     bra    cmd        and try again
  483. * search next entry
  484. cmdsme    decb            take account of length byte
  485.     cmpb    -1,u        ? entered longer than entry
  486.     bhs    cmdsiz        branch if not too long
  487. cmdfls    abx            skip to next entry
  488.     bra    cmdsch        and try next
  489. cmdsiz    leay    -3,u        prepare to compare
  490.     lda    -1,u        load size+2
  491.     suba    #2        to actual size entered
  492.     sta    -2,u        save size for countdown
  493. cmdcmp    decb            down one byte
  494.     lda    ,x+        next command character
  495.     cmpa    ,-y        ? same as that entered
  496.     bne    cmdfls        branch to flush  if not
  497.     dec    -2,u        count down length of entry
  498.     bne    cmdcmp        branch if more to test
  499.     abx            to next entry
  500.     ldd    -2,x        load offset
  501.     leax    d,x        compute routine address+2
  502. cmdxqt    tst    -3,u        set cc for carriage return test
  503.     leas    ,u        delete stack work area
  504.     jsr    -2,x        call command
  505.     lbra    cmdnol        go get next command
  506. cmdmem    tst    -2,u        ? valid hex number entered
  507.     bmi    cmdbad        branch error if not
  508.     leax    <cmemn-cmpadp,x to different entry
  509.     ldd    <number        load number entered
  510.     bra    cmdxqt        and enter memory command
  511.     
  512. ** commands are entered as a subroutine with:
  513. **    dpr->assist09 direct page work area
  514. **    z=1 carriage return entered
  515. **    z=0 non carriage return delimiter
  516. **    s=normal return address
  517. ** the label "cmdbad" may be entered to issue an
  518. ** an error flag (*).
  519.    
  520. **************************************************
  521. *        assist09 command tables
  522. *  these are the default command tables.  external
  523. *  tables of the same format may extend/replace
  524. *  these by using the vector swap function.
  525. *
  526. * entry format:
  527. *     +0...total size of entry (including this byte)
  528. *     +1...command string
  529. *     +n...two byte offset to command (entryaddr-*)
  530. *
  531. *  the tables terminate with a one byte -1 or -2.
  532. *  the -1 continues the command search with the
  533. *         second command table.
  534. *  the -2 terminates command searches.
  535. *****************************************************
  536.     
  537. * this is the default list for the second command
  538. * list entry.
  539. cmdtb2    fcb    -2        stop command searches
  540.     
  541. * this is the default list for the first command
  542. * list entry.
  543. cmdtbl    equ    *        monitor command table
  544.     fcb    4
  545.     fcc    /B/        'breakpoint' command
  546.     fdb    cbkpt-*
  547.     fcb    4
  548.     fcc    /C/        'call' command
  549.     fdb    ccall-*
  550.     fcb    4
  551.     fcc    /D/        'display' command
  552.     fdb    cdi   -*
  553.     fcb    4
  554.     fcc    /E/        'encode' command
  555.     fdb    cencde-*
  556.     fcb    4
  557.     fcc    /G/        'go' command
  558.     fdb    cgo-*
  559.     fcb    4
  560.     fcc    /L/        'load' command
  561.     fdb    cload-*
  562.     fcb    4
  563.     fcc    /M/        'memory' command
  564.     fdb    cmem-*
  565.     fcb    4
  566.     fcc    /N/        'nulls' command
  567.     fdb    cnulls-*
  568.     fcb    4
  569.     fcc    /O/        'offset' command
  570.     fdb    coffs-*
  571.     fcb    4
  572.     fcc    /P/        'punch' command
  573.     fdb    cpunch-*
  574.     fcb    4
  575.     fcc    /R/        'registers' command
  576.     fdb    creg-*
  577.     fcb    4
  578.     fcc    /S/        'stlevel' command
  579.     fdb    cstlev-*
  580.     fcb    4
  581.     fcc    /T/        'trace' command
  582.     fdb    ctrace-*
  583.     fcb    4
  584.     fcc    /V/        'verify' command
  585.     fdb    cver-*
  586.     fcb    4
  587.     fcc    /W/        'window' command
  588.     fdb    cwindo-*
  589.     fcb    -1        end, continue with the second
  590.    
  591. *************************************************
  592. *             [swi functions 4 and 5]
  593. *      4 - out2hs - decode byte to hex and add space
  594. *      5 - out4hs - decode word to hex and add space
  595. * input: x->byte or word to decode
  596. * output: characters sent to output handler
  597. *         x->next byte or word
  598. **************************************************
  599.     
  600. zout2h    lda    ,x+        load next byte
  601.     pshs    d        save - do not reread
  602.     ldb    #16        shift by 4 bits
  603.     mul            with multiply
  604.     bsr    zouthx        send out as hex
  605.     puls    d        restore bytes
  606.     anda    #$0f        isolate right hex
  607. zouthx    adda    #$90        prepare a-f adjust
  608.     daa            adjust
  609.     adca    #$40        prepare character bits
  610.     daa             adjust
  611. send    jmp    [vectab+.codta,pcr] send to out handler
  612.     
  613. zot4hs    bsr    zout2h        convert first byte
  614. zot2hs    bsr    zout2h        convert byte to hex
  615.     stx    4,s        update users x register
  616. * fall into space routine
  617.    
  618. *************************************************
  619. *            [swi function 7]
  620. *            ace - send blank to output handler
  621. * input: none
  622. * output: blank send to console handler
  623. *************************************************
  624.  
  625. zspace    lda    #'         load blank
  626.     bra    zotch2        send and return
  627.       
  628. ***********************************************
  629. *             [swi function 9]
  630. *          swap vector table entry
  631. * input: a=vector table code (offset)
  632. *        x=0 or replacement value
  633. * output: x=previous value
  634. ***********************************************
  635.  
  636. zvswth    lda    1,s        load requesters a
  637.     cmpa    #hivtr        ? sub-code too high
  638.     bhi    zotch3        ignore call if so
  639.     ldy    <vectab+.avtbl load vector table address
  640.     ldu    a,y        u=old entry
  641.     stu    4,s        return old value to callers x
  642.     stx    -2,s        ? x=0
  643.     beq    zotch3        yes, do not change entry
  644.     stx    a,y        replace entry
  645.     bra    zotch3        return from swi
  646. *d
  647.    
  648. ************************************************
  649. *                    [swi function 0]
  650. *   inchnp - obtain input char in a (no parity)
  651. *  nulls and rubouts are ignored.
  652. *  automatic line feed is sent upon recieving a
  653. *      carriage return.
  654. *  unless we are loading from tape.
  655. ************************************************
  656. zinchp    bsr    xqpaus        release processor
  657. zinch    bsr    xqcidt        call input data appendage
  658.     bcc    zinchp        loop if none available
  659.     tsta             test for null  
  660.     beq    zinch        ignore null
  661.     cmpa    #$7f        ? rubout
  662.     beq    zinch        branch yes to ignore
  663.     sta    1,s        store into callers a
  664.     tst    <misflg        ? load in progress
  665.     bne    zotch3        branch if so to not echo
  666.     cmpa    #cr        ? carriage return
  667.     bne    zin2        no, test echo byte
  668.     lda    #lf        load line feed
  669.     bsr    send        always echo line feed
  670. zin2    tst    <vectab+.echo    ? echo desired
  671.     bne    zotch3        no, return
  672. * fall through to outch
  673.    
  674. ************************************************
  675. *              [swi function 1]
  676. *          outch - output character from a
  677. *  input:  none
  678. *  output: if linefeed is the output character then
  679. *           c=0 no ctl-x recieved, c=1 ctl-x recieved
  680. ************************************************
  681. zotch1    lda    1,s        load character to send
  682.     leax    <zpcrls,pcr default for line feed
  683.     cmpa    #lf        ? line feed
  684.     beq    zpdtlp        branch to check pause if so
  685. zotch2    bsr    send        send to output routine
  686. zotch3    inc    <swicnt        bump up "swi" trace nest level
  687.     rti    return        from "swi" function
  688.    
  689. **************************************************
  690. *              [swi function 6]
  691. *        pcrlf - send cr/lf to console handler
  692. *  input: none
  693. *  output: cr and lf sent to handler
  694. *          c=0 no ctl-x, c=1 ctl-x recieved
  695. **************************************************
  696.     
  697. zpcrls    fcb    eot        null string
  698.     
  699. zpcrlf    leax    zpcrls,pcr    ready cr,lf string
  700. * fall into cr/lf code
  701.    
  702. **************************************************
  703. *             [swi function 3]
  704. *        pdata - output cr/lf and string
  705. * input: x->string
  706. * output: cr/lf and string sent to output console
  707. *         handler.
  708. *     c=0 no ctl-x, c=1 ctl-x recieved
  709. * note: line feed must follow carriage return for
  710. *       proper punch data.
  711. **************************************************
  712.  
  713. zpdata    lda    #cr        load carriage return
  714.     bsr    send        send it
  715.     lda    #lf        load line feed
  716. * fall into    pdata1
  717.    
  718. *************************************************
  719. *             [swi function 2]
  720. *         pdata1 - output string till eot ($04)
  721. *  this routine pauses if an input byte becomes
  722. *  available during output transmission until a
  723. *  second is recieved.
  724. * input: x->string
  725. * output: string sent to output console driver
  726. *         c=0 no ctl-x, c=1 ctl-x recieved
  727. *************************************************
  728.  
  729. zpdtlp    bsr    send        send character to driver
  730. zpdta1    lda    ,x+        load next character
  731.     cmpa    #eot        ? eot
  732.     bne    zpdtlp        loop if not
  733. * fall into pause check function
  734.    
  735. ********************************************
  736. *            [swi function 12]
  737. *     pause - return to task dispatching and check
  738. *             for freeze condition or ctl-x break
  739. *  this function enters the task pause handler so
  740. *  optionally other 6809 processes may gain control.
  741. *  upon return, check for a 'freeze' condition 
  742. *  with a resulting wait loop, or condition code
  743. *  return if a control-x is entered from the input
  744. *  handler.
  745. * output: c=1 if ctl-x has entered, c=0 otherwise
  746. ******************************************
  747.  
  748. zpause    bsr    xqpaus        release control at every line
  749.     bsr    chkabt        check for freeze or abort
  750.     tfr    cc,b        prepare to replace cc
  751.     stb    ,s        overlay old one on stack
  752.     bra    zotch3        return from "swi"
  753.     
  754. * chkabt - scan for input pause/abort during output
  755. * output: c=0 ok, c=1 abort (ctl-x issued)
  756. * volatile: u,x,d
  757.  
  758. chkabt    bsr    xqcidt        attempt input
  759.     bcc    chkrtn        branch no to return
  760.     cmpa    #can        ? ctl-x for abort
  761.     bne    chkwt        branch no to pause
  762. chksec    comb            set carry
  763. chkrtn    rts            return to caller with cc set  
  764. chkwt    bsr            xqpaus pause for a moment
  765.     bsr    xqcidt        ? key for start
  766.     bcc    chkwt        loop until recieved
  767.     cmpa    #can        ? abort signaled from wait
  768.     beq    chksec        branch yes
  769.     clra            set c=0 for no abort
  770.     rts            and return         
  771.    
  772. * save memory with jumps
  773. xqpaus    jmp    [vectab+.pause,pcr] to pause routine
  774. xqcidt    jsr    [vectab+.cidta,pcr] to input routine
  775.     anda    #$7f        strip parity
  776.     rts            return to caller
  777.    
  778. ********************************************
  779. *          nmi default interrupt handler
  780. *  the nmi handler is used for tracing instructions.
  781. *  trace printouts occur only as long as the stack
  782. *  trace level is not breached by falling below it.
  783. *  tracing continues until the count turns zero or
  784. *  a ctl-x is entered from the input console device.
  785. *********************************************
  786.     
  787. mshowp    fcb    'O,'P,'-,eot    opcode prep
  788.     
  789. *
  790. * one instruction was added to the nmi handler
  791. * this instruction stops the counter on the 
  792. * mc68681 duart which also negates the signal
  793. * which caused the interrupt (nmi)
  794. *
  795. nmir    tst    stop
  796. *
  797. *
  798.     bsr    lddp        load page and verify stack
  799.     tst    <misflg        ? thru a breakpoint
  800.     bne    nmicon        branch if so to continue
  801.     tst    <swicnt        ? inhibit "swi" during trace
  802.     bmi    nmitrc        branch yes
  803.     leax    12,s        obtain users stack pointer
  804.     cmpx    <slevel        ? to trace here
  805.     blo    nmitrc        branch if too low to display
  806.     leax    mshowp,pcr    load op prep
  807.     swi            send to console
  808.     fcb    pdata1        function
  809.     rol    <delim        save carry bit
  810.     leax    lastop,pcr    point to last op
  811.     swi            send out as hex
  812.     fcb    out4hs        function
  813.     bsr    regprs        follow memory with registers
  814.     bcs    zbkcmd        branch if "cancel"
  815.     ror    <delim        restore carry bit
  816.     bcs    zbkcmd        branch if "cancel" 
  817.     ldx    <tracec        load trace count
  818.     beq    zbkcmd        if zero to command handler
  819.     leax    -1,x        minus one
  820.     stx    <tracec        refresh
  821.     beq    zbkcmd        stop trace when zero
  822.     bsr    chkabt        ? abort the trace
  823.     bcs    zbkcmd        branch yes to command handler
  824. nmitrc    lbra    ctrce3        no, trace another instruction
  825.     
  826. regprs    lbsr    regprt        print registers as from command
  827.     rts    return        to caller
  828.     
  829. * just executed thru a brkpnt.  now continue normally
  830. nmicon    clr    <misflg        clear thru flag
  831.     lbsr    armbk2        arm breakpoints
  832. rti    rti            and continue users program
  833.     
  834. * lddp - setup direct page register, verify stack.
  835. * an invalid stack causes a return to the command
  836. * handler.
  837. * input: fully stacked registers from an interrupt
  838. * output: dpr loaded to work page
  839.     
  840. errmsg    fcb    '?,bell,$20,eot error response
  841.     
  842. lddp    ldb    basepg,pcr    load direct page high byte
  843.     tfr    b,dp        setup direct page register
  844.     cmpa    3,s        ? is stack valid
  845.     beq    rts        yes, return
  846.     lds    <rstack        reset to initial stack pointer
  847. error    leax    errmsg,pcr    load error report
  848.     swi            send out before registers
  849.     fcb    pdata        on next line
  850.  
  851. * fall into breakpoint handler
  852.    
  853. **********************************************
  854. *             [swi function 10]
  855. *         breakpoint program function
  856. *  print registers and go to command hanler
  857. ***********************************************
  858.  
  859. zbkpnt    bsr    regprs        print out registers
  860. zbkcmd    lbra    cmdnep        now enter command handler
  861.    
  862. ********************************************
  863. *    irq, reserved, swi2 and swi3 interrupt handlers
  864. *  the default handling is to cause a breakpoint.
  865. ********************************************
  866.  
  867. swi2r    equ    *        swi2 entry
  868. swi3r    equ    *        swi3 entry
  869. irqr    equ    *        irq entry
  870. rsrvdr    bsr    lddp        set base page, validate stack
  871.     bra    zbkpnt         force a breakpoint
  872.    
  873. ******************************************
  874. *        firq handler
  875. *  just return for the firq interrupt
  876. ******************************************
  877.  
  878. firqr    equ    rti        immediate return
  879.    
  880. **************************************************
  881. *      default i/o drivers
  882. **************************************************
  883.    
  884. * cidta - return console input character
  885. * output: c=0 if no data ready, c=1 a=character
  886. * u volatile
  887. *
  888. * several modifications were made to the acia
  889. * i/o driver so that a mc68681 duart could be
  890. * used in its place.  modifications involved setting
  891. * up offsets (stat,reciv,etc.) to the base hardware
  892. * address so that the duart's internal registers 
  893. * could be accessed, along with more extensive
  894. * initialization than that needed by the acia
  895. * (i.e. setting up baud rate etc.)
  896. *
  897. cidta    ldu    <vectab+.duart    load acia address
  898.     lda    stat,u        load status register
  899.     lsra    test        reciever register flag
  900.     bcc    cirtn        return if nothing
  901.     lda    reciv,u        load data byte
  902. cirtn    rts            return to caller
  903.    
  904. * cion - input console initialization
  905. * coon - output console initialization
  906. * a,x  volatile
  907. cion    equ    *
  908. coon    ldd    #mbaud        initialize mode r1 and baud rate
  909.     ldx    <vectab+.duart    load duart address
  910.     std    mr1a,x        7bity no parity and 9600 baud
  911.     lda    #$07        mode register 2
  912.     sta    mr2a,x        normal mode 2 stop bits
  913.     ldd    #$8008        counter mode,external clock
  914.     std    acr,x        baud rate set 2 timer int enabled
  915.     lda    #$15        command register init.
  916.     sta    cra,x        enable transmitter and receiver
  917.     ldd    #$0010        initial count is 16 for the counter
  918.     std    ctur,x        15 for rti 1 to trace 1 inst.
  919. rts    rts            return to caller
  920.     
  921. * the following have no duties to perform
  922.  
  923. cioff    equ    rts        console input off
  924. cooff    equ    rts        console output off
  925.    
  926. * codta - output character to console device
  927. * input: a=character to send
  928. * output: char sent to terminal with proper padding
  929. * all registers transparent
  930.     
  931. codta    pshs    u,d,cc        save registers,work byte
  932.     ldu    <vectab+.duart    address duart
  933.     bsr    codtao        call output char subrotine
  934.     cmpa    #dle        ? data line escape
  935.     beq    codtrt        yes, return
  936.     ldb    <vectab+.pad    default to char pad count
  937.     cmpa    #cr        ? cr
  938.     bne    codtpd        branch no
  939.     ldb    <vectab+.pad+1    load new line pad count
  940. codtpd    clra            create null
  941.     stb    ,s        save count
  942.     fcb    skip2        enter loop
  943. codtlp    bsr    codtao        send null
  944.     dec    ,s        ? finished
  945.     bpl    codtlp        no, continue with more
  946. codtrt    puls    pc,u,d,cc    restore registers and return
  947.     
  948. codtad    lbsr    xqpaus        temporary give up control
  949. codtao    ldb    stat,u        load acia control register
  950.     bitb    #$04        ? tx register clear
  951.     beq    codtad        release control if not
  952.     sta    trans,u        store into data register
  953.     rts            return to caller
  954. *e
  955.    
  956. * bson - turn on read/verify/punch mechanism
  957. * a is volatile
  958.     
  959. bson    lda    #$11        set read code
  960.     tst    6,s        ? read or verify
  961.     bne    bson2        branch yes
  962.     inca            set to write
  963. bson2    swi            perform output
  964.     fcb    outch        function
  965.     inc    <misflg        set load in progress flag
  966.     rts    return        to caller
  967.    
  968. * bsoff - turn off read/verify/punch mechanism
  969. * a,x volatile
  970.  
  971. bsoff    lda    #$14        to dc4 - stop
  972.     swi            send out
  973.     fcb    outch        function
  974.     deca            change to dc3 (x-off)
  975.     swi            send out
  976.     fcb    outch        function
  977.     dec    <misflg        clear load in progress flag
  978.     ldx    #25000         delay 1 second (2mhz clock)
  979. bsoflp    leax    -1,x        count down
  980.     bne    bsoflp        loop till done
  981.     rts    return        to caller
  982.    
  983. * bsdta - read/verify/punch handler
  984. * input: s+6=code byte, verify(-1),punch(0),load(1)
  985. *        s+4=start address
  986. *        s+2=stop address
  987. *        s+0=return address
  988. * output: z=1 normal completion, z=0 invalid load/ver
  989. * registers are volatile
  990.     
  991. bsdta    ldu    2,s        u=to address or offset
  992.     tst    6,s        ? punch
  993.     beq    bsdpun        branch yes
  994.  
  995. * during read/verify: s+2=msb address save byte
  996. *                     s+1=byte counter
  997. *                     s+0=checksum
  998. *                     u holds offset
  999.  
  1000.     leas    -3,s        room for work/counter/checksum
  1001. bsdld1    swi            get next character
  1002.     fcb    inchnp        function
  1003. bsdld2    cmpa    #'S        ? start of s1/s9
  1004.     bne    bsdld1        branch not
  1005.     swi            get next character
  1006.     fcb    inchnp        function
  1007.     cmpa    #'9        ? have s9
  1008.     beq    bsdsrt        yes, return good code
  1009.     cmpa    #'1        ? have new record
  1010.     bne    bsdld2        branch if not
  1011.     clr    ,s        clear checksum
  1012.     bsr    byte        obtain byte count
  1013.     stb    1,s        save for decrement
  1014. * read address
  1015.     bsr    byte        obtain high value
  1016.     stb    2,s        save it
  1017.     bsr    byte        obtain low value
  1018.     lda    2,s        make d=value
  1019.     leay    d,u        y=address+offset
  1020. * store text
  1021. bsdnxt    bsr    byte        next byte
  1022.     beq    bsdeol        branch if checksum
  1023.     tst    9,s        ? verify only
  1024.     bmi    bsdcmp        yes, only compare
  1025.     stb    ,y        store into memory
  1026. bsdcmp    cmpb    ,y+        ? valid ram
  1027.     beq    bsdnxt        yes, continue reading
  1028. bsdsrt    puls    pc,x,a        return with z set proper
  1029.     
  1030. bsdeol    inca            ? valid checksum
  1031.     beq    bsdld1        branch yes
  1032.     bra    bsdsrt        return z=0 invalid
  1033.     
  1034. * byte builds 8 bit value from two hex digits in
  1035. byte    bsr    bythex        obtain first hex
  1036.     ldb    #16        prepare shift
  1037.     mul            over to a
  1038.     bsr    bythex        obtain second hex
  1039.     pshs    b        save high hex
  1040.     adda    ,s+        combine both sides
  1041.     tfr    a,b        send back in b
  1042.     adda    2,s        compute new checksum
  1043.     sta    2,s        store back
  1044.     dec    3,s        decrement byte count
  1045. bytrts    rts            return to caller
  1046.     
  1047. bythex    swi            get next hex
  1048.     fcb    inchnp        character
  1049.     lbsr    cnvhex        convert to hex
  1050.     beq    bytrts        return if valid hex
  1051.     puls    pc,u,y,x,a    return to caller with z=0
  1052.    
  1053. * punch stack use: s+8=to address
  1054. *                  s+6=return address
  1055. *                  s+4=saved padding values
  1056. *                  s+2 from address
  1057. *                  s+1=frame count/checksum
  1058. *                  s+0=byte count
  1059.  
  1060. bsdpun    ldu    <vectab+.pad    load padding values
  1061.     ldx    4,s        x=from address
  1062.     pshs    u,x,d        create stack work area
  1063.     ldd    #24        set a=0, b=24
  1064.     stb    <vectab+.pad    setup 24 character pads
  1065.     swi            send nulls out
  1066.     fcb    outch        function
  1067.     ldb    #4        setup new line pad to 4
  1068.     std    <vectab+.pad    setup punch padding
  1069. * calculate size
  1070. bspgo    ldd    8,s        load to
  1071.     subd    2,s        minus from=length
  1072.     cmpd    #24        ? more than 23
  1073.     blo    bspok        no, ok
  1074.     ldb    #23        force to 23 max
  1075. bspok    incb            prepare counter
  1076.     stb    ,s        store byte count
  1077.     addb    #3        adjust to frame count
  1078.     stb    1,s        save
  1079. *punch cr,lf,nuls,s,1
  1080.     leax    <bspstr,pcr    load start record header
  1081.     swi            send out
  1082.     fcb    pdata        function
  1083. * send frame count
  1084.     clrb            initialize checksum
  1085.     leax    1,s        point to frame count and addr
  1086.     bsr    bspun2        send frame count
  1087. *data address
  1088.     bsr    bspun2        send address hi
  1089.     bsr    bspun2        send address low
  1090. *punch data
  1091.     ldx    2,s        load start data address
  1092. bspmre    bsr    bspun2        send out next byte
  1093.     dec    ,s        ? final byte
  1094.     bne    bspmre        loop if not done
  1095.     stx    2,s        update from address value
  1096. *punch checksum
  1097.     comb            complement
  1098.     stb    1,s        store for sendout
  1099.     leax    1,s        point to it
  1100.     bsr    bspunc        send out as hex
  1101.     ldx    8,s        load top address
  1102.     cmpx    2,s        ? done
  1103.     bhs    bspgo        branch not
  1104.     leax    <bspeof,pcr    prepare end of file
  1105.     swi            send out string
  1106.     fcb    pdata        function
  1107.     ldd    4,s        recover pad counts
  1108.     std    <vectab+.pad    restore
  1109.     clra            set z=1 for ok return
  1110.     puls    pc,u,x,d    return with ok code
  1111.     
  1112. bspun2    addb    ,x        add to checksum
  1113. bspunc    lbra    zout2h        send out as hex and return
  1114.     
  1115. bspstr    fcb    'S,'1,eot cr,lf,nulls,S,1
  1116. bspeof    fcc    /S9030000FC/    eof string
  1117.     fcb    cr,lf,eot
  1118.    
  1119. * hsdta - high  speed print memory
  1120. * input: s+4=start address
  1121. *        s+2=stop address
  1122. *        s+0=return address
  1123. * x,d volatile
  1124. *  send title
  1125.  
  1126. hsdta    swi            send new line
  1127.     fcb    pcrlf        function
  1128.     ldb    #6        prepare 6 spaces
  1129. hsblnk    swi            send blank
  1130.     fcb   space        function
  1131.     decb            count down
  1132.     bne    hsblnk        loop if more
  1133.     clrb            setup byte count
  1134. hshttl    tfr    b,a        prepare for convert
  1135.     lbsr    zouthx        convert to a hex digit
  1136.     swi            send blank
  1137.     fcb    space        function
  1138.     swi            send another
  1139.     fcb    space        blank
  1140.     incb            up another
  1141.     cmpb    #$10        ? past 'f'
  1142.     blo    hshttl        loop until so
  1143. hshlne    swi            to next line
  1144.     fcb    pcrlf        function
  1145.     bcs    hsdrtn        return if user entered ctl-x
  1146.     leax    4,s        point at address to convert
  1147.     swi            print out address
  1148.     fcb    out4hs        function
  1149.     ldx    4,s        load address proper
  1150.     ldb    #16        next sixteen
  1151. hshnxt    swi            convert byte to hex and send
  1152.     fcb    out2hs        function
  1153.     decb            count down
  1154.     bne    hshnxt        loop if not sixteenth
  1155.     swi            send blank
  1156.     fcb    space        function
  1157.     ldx    4,s        reload from address
  1158.     ldb    #16        count
  1159. hshchr    lda    ,x+        next byte
  1160.     bmi    hshdot        too large, to a dot
  1161.     cmpa    #'         ? lower than a blank
  1162.     bhs    hshcok        no, branch ok
  1163. hshdot    lda    #'.        convert invalid to a blank
  1164. hshcok    swi            send character
  1165.     fcb    outch        function
  1166.     decb            ? done
  1167.     bne    hshchr        branch no
  1168.     cpx    2,s        ? past last address
  1169.     bhs    hsdrtn        quit if so
  1170.     stx    4,s        update from address
  1171.     lda    5,s        load low byte address
  1172.     asla            ? to section boundry
  1173.     bne    hshlne        branch if not
  1174.     bra    hsdta        branch if so
  1175. hsdrtn    swi            send new line
  1176.     fcb    pcrlf        function
  1177.     rts            return to caller
  1178. *f
  1179.    
  1180. ***********************************************
  1181. *     a s s i s t 0 9    c o m m a n d s
  1182. ***********************************************
  1183.    
  1184. **********   registers - display and change registers
  1185.  
  1186. creg    bsr    regprt        print registers
  1187.     inca            set for change function
  1188.     bsr    regchg        go change, display registers
  1189.     rts    return        to command processor
  1190.    
  1191. ********************************************
  1192. *      regprt - print/change registers subroutine
  1193. *  will abort to 'cmdbad' if overflow detected during
  1194. *  a change operation.  change displays registers when
  1195. *  done.
  1196. * register mask list consists of:
  1197. *  a) characters denoting register
  1198. *  b) zero for one byte, -1 for two
  1199. *  c) offset on stack to register position 
  1200. * input:    +4=stacked registers
  1201. *        a=0 print, a#0 print and change
  1202. * output: (only for register display)
  1203. *         c=1 control-x entered, c=0 otherwise
  1204. * volatile: d,x (change)
  1205. *           b,x (display)
  1206. *******************************************
  1207.  
  1208. regmsk    fcb    'P,'C,-1,19    pc reg
  1209.     fcb    'A,0,10        a reg
  1210.     fcb    'B,0,11        b reg
  1211.     fcb    'X,-1,13    x reg
  1212.     fcb    'Y,-1,15    y reg
  1213.     fcb    'U,-1,17    u reg
  1214.     fcb    'S,-1,1        s reg
  1215.     fcb    'C,'c,0,9    cc reg
  1216.     fcb    'D,'p,0,12    dp reg
  1217.     fcb    0        end of list
  1218.     
  1219. regprt    clra            setup print only flag
  1220. regchg    leax    4+12,s        ready stack value
  1221.     pshs    y,x,a        save on stack with option
  1222.     leay    regmsk,pcr    load register mask
  1223. regp1    ldd    ,y+        load next char or <=0
  1224.     tsta            ? end of characters
  1225.     ble    regp2        branch not character
  1226.     swi            send to console
  1227.     fcb    outch        function byte
  1228.     bra    regp1        check next
  1229. regp2    lda    #'-         ready '-'
  1230.     swi            send out
  1231.     fcb    outch        with outch
  1232.     leax    b,s        x->register to print
  1233.     tst    ,s        ? change option
  1234.     bne    regcng        branch yes
  1235.     tst    -1,y        ? one or two bytes
  1236.     beq    regp3        branch zero means one
  1237.     swi            perform word hex
  1238.     fcb    out4hs        function
  1239.     fcb    skip2        skip byte print
  1240. regp3    swi            perform byte hex
  1241.     fcb    out2hs        function
  1242. reg4    ldd    ,y+        to front of next entry
  1243.     tstb            ? end of entries
  1244.     bne    regp1        loop if more
  1245.     swi            force new line
  1246.     fcb    pcrlf        function
  1247. regrtn    puls    pc,y,x,a    restore stack and return
  1248.     
  1249. regcng    bsr    bldnnb        input binary number
  1250.     beq    regnxc        if change then jump
  1251.     cmpa    #cr        ? no more desired
  1252.     beq    regagn        branch nope
  1253.     ldb    -1,y        load size flag
  1254.     decb            minus one
  1255.     negb            make positive
  1256.     aslb            times two (=2 or =4)
  1257. regskp    swi            perform spaces
  1258.     fcb    space        function
  1259.     decb
  1260.     bne    regskp        loop if more
  1261.     bra    reg4        continue with next register
  1262. regnxc    sta    ,s        save delimiter in option
  1263. *                     (always > 0)
  1264.     ldd    <number        obtain binary result
  1265.     tst    -1,y        ? two bytes worth
  1266.     bne    regtwo        branch yes
  1267.     lda    ,-x        setup for two
  1268. regtwo    std    ,x        store in new value
  1269.     lda    ,s        recover delimiter
  1270.     cmpa    #cr        ? end of changes
  1271.     bne    reg4        no, keep on truck'n
  1272. * move stacked data to new stack in case stack
  1273. * pointer has changed
  1274. regagn    leax    tstack,pcr    load temp area
  1275.     ldb    #21        load count
  1276. regtf1    puls    a        next byte
  1277.     sta    ,x+        store into temp
  1278.     decb            count down
  1279.     bne    regtf1        loop if more
  1280.     lds    -20,x        load new stack pointer
  1281.     ldb    #21        load count again
  1282. regtf2    lda    ,-x        next to store
  1283.     pshs    a        back onto new stack
  1284.     decb            count down
  1285.     bne    regtf2        loop if more
  1286.     bra    regrtn        go restart command
  1287.    
  1288. *********************************************
  1289. *  bldnum - builds binary value from input hex
  1290. *  the active expression handler is used.
  1291. * input: s=return address
  1292. * output: a=delimiter which terminated value
  1293. *                            (if delm not zero)
  1294. *         "number"=word binary result
  1295. *         z=1 if input recieved, z=0 if no hex recieved
  1296. *  registers are transparent
  1297. **********************************************
  1298.     
  1299. * execute single or extended rom expression handler
  1300. *
  1301. * the flag "delim" is used as follows:
  1302. *   delim=0  no leading blanks, no forced terminator
  1303. *   delim=chr  accept leading 'chr's, forced terminator
  1304. bldnnb    clra            no dynamic delimiter
  1305.     fcb    skip2        skip next instruction
  1306. * build with leading blanks
  1307. bldnum    lda    #'         allow leading blanks
  1308.     sta    <delim        store as delimiter
  1309.     jmp    [vectab+.expan,pcr] to exp analyzer
  1310.        
  1311. * this is the default single rom analyzer. we accept:
  1312. *    1) hex input
  1313. *    2) 'M' for last memory examine address
  1314. *    3) 'P' for program counter address
  1315. *    4) 'W' for window value
  1316. *    5) '@' for indirect value
  1317.  
  1318. exp1    pshs    x,b        save registers
  1319. expdlm    bsr    bldhxi        clear number, check first char
  1320.     beq    exp2        if hex digit continue building
  1321. * skip blanks if desired
  1322.     cmpa    <delim        ? correct delimiter
  1323.     beq    expdlm        yes, ignore it
  1324. * test for m or p
  1325.     ldx    <addr        default for 'm'
  1326.     cmpa    #'M        ? memory examine addr wanted
  1327.     beq    exptdl        branch if so
  1328.     ldx    <pcnter        default for 'p'
  1329.     cmpa    #'P        ? last program counter wanted
  1330.     beq    exptdl        branch if so
  1331.     ldx    <window        default to window
  1332.     cmpa    #'W        ? window wanted
  1333.     beq    exptdl
  1334. exprtn    puls    pc,x,b        return and restore registers
  1335. * got hex, now continue building
  1336. exp2    bsr    bldhex        compute next digit
  1337.     beq    exp2        continue if more
  1338.     bra    expcdl        search for +/-
  1339. * store value and check if need delimiter
  1340. exptdi    ldx    ,x        indirection desired
  1341. exptdl    stx    <number        store result
  1342.     tst    <delim        ? to force a delimiter
  1343.     beq    exprtn        return if not with value
  1344.     bsr    read        obtain next character
  1345. * test for + or -
  1346. expcdl    ldx    <number        load last value
  1347.     cmpa    #'+        ? add operator
  1348.     bne    expchm        branch not 
  1349.     bsr    exptrm        compute next term
  1350.     pshs    a        save delimiter
  1351.     ldd    <number        load new term
  1352. expadd    leax    d,x        add to x
  1353.     stx    <number        store as new result
  1354.     puls    a        restore delimiter
  1355.     bra    expcdl        now test it
  1356. expchm    cmpa    #'-        ? subtract operator
  1357.     beq    expsub        branch if so
  1358.     cmpa    #'@        ? indirection desired
  1359.     beq    exptdi        branch if so
  1360.     clrb            set delimiter return
  1361.     bra    exprtn        and return to caller
  1362. expsub    bsr    exptrm        obtain next term
  1363.     pshs    a        save delimiter
  1364.     ldd    <number        load up next term
  1365.     nega    negate        a
  1366.     negb    negate        b
  1367.     sbca    #0        correct for a
  1368.     bra    expadd        go add to expresion
  1369.  
  1370. * compute next expression term
  1371. * output: x=old value
  1372. *         'number'=next term
  1373.  
  1374. exptrm    bsr    bldnum        obtain next value
  1375.     beq    cnvrts        return if valid number
  1376. bldbad    lbra    cmdbad        abort command if invalid
  1377.    
  1378. *********************************************
  1379. *  build binary value using input characters.
  1380. * input: a=ascii hex value or delimiter
  1381. *           +0=return address
  1382. *           +2=16 bit result area
  1383. * output: z=1 a=binary value
  1384. *         z=0 if invalid hex character (a unchanged)
  1385. * volatile: d
  1386. ****************************************
  1387.  
  1388. bldhxi    clr    <number        clear number
  1389.     clr    <number+1    clear number
  1390. bldhex    bsr    read        get input character
  1391. bldhxc    bsr    cnvhex        convert and test character
  1392.     bne    cnvrts        return if not a number
  1393.     ldb    #16        prepare shift
  1394.     mul            by four places
  1395.     lda    #4        rotate binary into value
  1396. bldshf    aslb            obtain next bit
  1397.     rol    <number+1        into low byte
  1398.     rol    <number        into hi byte
  1399.     deca            count down
  1400.     bne    bldshf        branch if more to do
  1401.     bra    cnvok        set good return code
  1402.    
  1403. ****************************************
  1404. * convert ascii character to binary byte
  1405. * input: a=ascii
  1406. * output: z=1 a=binary value
  1407. *         z=0 if invalid
  1408. * all registers transparent
  1409. * (a unaltered if invalid hex)
  1410. **************************************
  1411.  
  1412. cnvhex    cmpa    #'0        ? lower tigh hex
  1413.     blo    cnvrts        branch not value
  1414.     cmpa    #'9        ? possible a-f
  1415.     ble    cnvgot        branch no to accept
  1416.     cmpa    #'A        ? less than ten
  1417.     blo    cnvrts        return if minus (invalid)
  1418.     cmpa    #'F        ? not too large
  1419.     bhi    cnvrts        no, return too large
  1420.     suba    #7        down to binary
  1421. cnvgot    anda    #$0f        clear high byte
  1422. cnvok    orcc    #4        force zero on for valid hex
  1423. cnvrts    rts            return to caller
  1424.    
  1425. * get input char, abort command if control-x (cancel)
  1426. read    swi            get next character
  1427.     fcb            inchnp function
  1428.     cmpa    #can        ? abort command
  1429.     beq    bldbad        branch to abort if so
  1430.     rts            return to caller
  1431. *g
  1432.    
  1433. ************   go - start program execution
  1434.  
  1435. cgo    bsr    goaddr        build address if needed
  1436.     rti            start executing
  1437.     
  1438. * find optional new program counter. also arm the
  1439. * breakpoints.
  1440. goaddr    puls    y,x        recover return address
  1441.     pshs    x        store return back
  1442.     bne    gondft        if no carf ? swi breakpointed
  1443. *  default program counter, so fall through if
  1444. *  immediate breakpoint.
  1445.     lbsr    cbkldr        search breakpoints
  1446.     ldx    12,s        load program counter
  1447. armblp    decb            count down
  1448.     bmi    armbk2        done, none to single trace
  1449.     lda    -numbkp*2,y    pre-fetch opcode
  1450.     cmpx    ,y++        ? is this a breakpoint
  1451.     bne    armblp        loop if not
  1452.     cmpa    #$3f        ? swi breakpointed
  1453.     bne    armnsw        no, skip setting of pass flag
  1454.     sta    <swibfl        show upcomming swi not brkpnt
  1455. armnsw    inc    <misflg        flag thru a breakpoint
  1456.     lbra    cdot        do single trace w/o breakpoints
  1457. * obtain new program counter
  1458. gondft    lbsr    cdnum        obtain new program counter
  1459.     std    12,s        store into stack
  1460. armbk2    lbsr    cbkldr        obtain table
  1461.     neg    <bkptct        complement to show armed
  1462. armlop    decb            ? done
  1463.     bmi    cnvrts        return when done
  1464.     lda    [,y]        load opcode
  1465.     sta    -numbkp*2,y    store into opcode table
  1466.     lda    #$3f        ready "swi" opcode
  1467.     sta    [,y++]        store and move up table
  1468.     bra    armlop        and continue
  1469.  
  1470. *****************   call - call address as subroutine
  1471.  
  1472. ccall    bsr    goaddr        fetch address if needed
  1473.     puls    u,y,x,dp,d,cc    restore users registers
  1474.     jsr    [,s++]        call user subroutine
  1475. cgobrk    swi            perform breakpoint
  1476.     fcb    brkpt        function
  1477.     bra    cgobrk        loop until user changes pc
  1478.    
  1479. *****************memory - display/change memory
  1480. * cmemn and cmpadp are direct entry points from
  1481. * the command handler for quick commands
  1482. cmem    lbsr    cdnum        obtain address
  1483. cmemn    std    <addr        store default
  1484. cmem2    ldx    <addr        load pointer
  1485.     lbsr    zout2h        send out hex value of byte
  1486.     lda    #'-        load delimiter
  1487.     swi            send out
  1488.     fcb    outch        function
  1489. cmem4    lbsr    bldnnb        obtain new byte value
  1490.     beq    cmenum        branch if number
  1491. * coma - skip byte
  1492.     cmpa    #',        ? comma
  1493.     bne    cmnotc        branch not
  1494.     stx    <addr        update pointer
  1495.     leax    1,x        to next byte
  1496.     bra    cmem4        and input it
  1497. cmenum    ldb    <number+1    load low byte value
  1498.     bsr    mupdat        go overlay memory byte
  1499.     cmpa    #',        ? continue with no display
  1500.     beq    cmem4        branch yes
  1501. * quoted string
  1502. cmnotc    cmpa    #''        ? quoted string
  1503.     bne    cmnotq        branch no
  1504. cmestr    bsr    read        obtain next character
  1505.     cmpa    #''        ? end of quoted string
  1506.     beq    cmspe        yes, quit string mode
  1507.     tfr    a,b        to b for subroutine
  1508.     bsr    mupdat        go update byte
  1509.     bra    cmestr        get next character
  1510. * blank - next byte
  1511. cmnotq    cmpa    #$20        ? blank for next byte
  1512.     bne    cmnotb        branch not
  1513.     stx    <addr        update pointer
  1514. cmspe    swi            give space
  1515.     fcb    space        function
  1516.     bra    cmem2
  1517. * line feed - next byte with address
  1518. cmnotb    cmpa    #lf        ? line feed for next byte
  1519.     bne    cmnotl        branch no
  1520.     lda    #cr        give carriage return
  1521.     swi            to console
  1522.     fcb    outch        handler
  1523.     stx    <addr        store next address
  1524.     bra    cmpadp        branch to show
  1525. * up arrow - previous byte and address
  1526. cmnotl    cmpa    #'^        ? up arrow for previous byte
  1527.     bne    cmnotu        branch not
  1528.     leax    -2,x        down to previous byte
  1529.     stx    <addr        store new pointer
  1530. cmpads    swi            force new line
  1531.     fcb    pcrlf        function
  1532. cmpadp    bsr    prtadr        go print its value
  1533.     bra    cmem2        then prompt for input
  1534. * slash - next byte with address
  1535. cmnotu    cmpa    #'/        ? slash for current display
  1536.     beq    cmpads        yes, send address
  1537.     rts            return from command
  1538.     
  1539. * print current address
  1540. prtadr    ldx    <addr        load pointer value
  1541.     pshs    x        save x on stack
  1542.     leax    ,s        point to it for display
  1543.     swi            display pointer in hex
  1544.     fcb    out4hs        function
  1545.     puls    pc,x        recover pointer and return
  1546.    
  1547. * update byte
  1548. mupdat    ldx    <addr        load next byte pointer
  1549.     stb    ,x+        store and increment x
  1550.     cmpb    -1,x        ?  successfull store
  1551.     bne    mupbad        branch for '?'  if not
  1552.     stx    <addr        store new pointer value
  1553.     rts            back to caller
  1554. mupbad    pshs    a        save a register
  1555.     lda    #'?        show invalid
  1556.     swi            send out
  1557.     fcb    outch        function
  1558.     puls    pc,a        return to caller
  1559.    
  1560. *****************   window  -  set window value
  1561.  
  1562. cwindo    bsr    cdnum        obtain window value
  1563.     std    <window        store it in
  1564.     rts            end command
  1565.    
  1566. ***************   display - high speed display memory
  1567.  
  1568. cdi       bsr    cdnum        fetch address
  1569.     andb    #$f0        force to 16 boundry
  1570.     tfr    d,y        save in y
  1571.     leax    15,y        default length          
  1572.     bcs    cdisps        branch if end of input
  1573.     bsr    cdnum        obtain count
  1574.     leax    d,y        assume count, compute end addr
  1575. cdisps    pshs    y,x        setup parameters for hsdata
  1576.     cmpd    2,s        ? was it count
  1577.     bls    cdcnt        branch yes
  1578.     std    ,s        store high address
  1579. cdcnt    jsr    [vectab+.hsdta,pcr]  call print routine
  1580.     puls    pc,u,y        clean stack and end command
  1581.    
  1582. * obtain number - abort if none
  1583. * only delimiters of cr, blank, or '/' are accepted      
  1584. * output: d=value, c=1 if carriage return delmiter,
  1585. *                                  else c=0
  1586. cdnum    lbsr    bldnum        obtain number
  1587.     bne    cdbadn        branch if invalid
  1588.     cmpa    #'/        ? valid delimiter
  1589.     bhi    cdbadn        branch if not for error
  1590.     cmpa    #cr+1        leave compare for carriage ret
  1591.     ldd    <number        load number
  1592.     rts
  1593. cdbadn    lbra    cmdbad        return to error mechanism
  1594.    
  1595. *************   punch - punch memory in s1-s9 format
  1596.  
  1597. cpunch    bsr    cdnum        obtain start address
  1598.     tfr    d,y        save in y
  1599.     bsr    cdnum        obtain end address
  1600.     clr    ,-s        setup punch function code
  1601.     pshs    y,d        store values on stack
  1602. ccalbs    jsr    [vectab+.bson,pcr]  initialize handler
  1603.     jsr    [vectab+.bsdta,pcr] perform function
  1604.     pshs    cc        save return code
  1605.     jsr    [vectab+.bsoff,pcr] turn off handler
  1606.     puls    cc        obtain condition code saved
  1607.     bne    cdbadn        branch if error
  1608.     puls    pc,y,x,a    return from command
  1609.    
  1610. ***************  load - load memory from s1-s9 format
  1611.  
  1612. cload    bsr    clvofs        call setup and pass code
  1613.     fcb    1        load function code for packet
  1614.     
  1615. clvofs    leau    [,s++]        load code in high byte of u
  1616.     leau    [,u]        not changing cc and restore s
  1617.     beq    clvdft        branch if carriage return next
  1618.     bsr    cdnum        obtain offset
  1619.     fcb    skip2        skip default offset
  1620. clvdft    clra    create        zero offset
  1621.     clrb            as default
  1622.     pshs    u,dp,d        setup code, null word, offset
  1623.     bra    ccalbs        enter call to bs routines
  1624.    
  1625. ***************  verify - compare memory with files
  1626.  
  1627. cver    bsr    clvofs        compute offset if any
  1628.     fcb    -1        verify fnctn code for packet
  1629.    
  1630. ***************  trace - trace instructions
  1631. *                . - single step trace
  1632. *
  1633. * modifications were made to the trace routine 
  1634. * so the counter on the mc68681 duart could be 
  1635. * used in place of the timer on the mc6840 ptm.
  1636. * irq on the mc68681 was used to execute the trace.
  1637. *
  1638. ctrace    bsr    cdnum        obtain trace count
  1639.     std    <tracec        store count
  1640. cdot    leas    2,s        rid command return from stack
  1641. ctrce3    ldu    [10,s]        load opcode to execute
  1642.     stu    <lastop        store for trace interrupt
  1643.     ldu    <vectab+.duart load duart address
  1644.     lda    scc,u        issue start counter command
  1645.     rti            return for one instruction
  1646.    
  1647. *************nulls  -  set new line and char padding
  1648.  
  1649. cnulls    bsr    cdnum        obtain new line pad
  1650.     std    <vectab+.pad    reset values
  1651.     rts            end command
  1652.    
  1653. ******************stlevel - set stack trace level
  1654.  
  1655. cstlev    beq    stldft        take default
  1656.     bsr    cdnum        obtain new stack level
  1657.     std    <slevel        store new entry
  1658.     rts            to command handler
  1659. stldft    leax    14,s        compute nmi compare
  1660.     stx    <slevel        and store it
  1661.     rts            end command
  1662.    
  1663. ******************offset - compute short and long
  1664. *                 branch offsets
  1665.  
  1666. coffs    bsr    cdnum        obtain instruction address
  1667.     tfr    d,x        use as from address
  1668.     bsr    cdnum        obtain to address
  1669. * d=to instruction, x=from instruction offset byte(s)
  1670.     leax    1,x        adjust for *+2 short branch
  1671.     pshs    y,x        store work word and value on s
  1672.     subd    ,s        find offset
  1673.     std    ,s        save over stack
  1674.     leax    1,s        point for one byte display
  1675.     sex            sign extend low byte
  1676.     cmpa    ,s        ? valid one byte offset
  1677.     bne    cofno1        branch if not
  1678.     swi            show one byte offset
  1679.     fcb    out2hs        function
  1680. cofno1    ldu    ,s        reload offset
  1681.     leau    -1,u        convert to long branch offset
  1682.     stu    ,x        store back where x points now
  1683.     swi            show two byte offset
  1684.     fcb    out4hs        function
  1685.     swi            force new line
  1686.     fcb    pcrlf        function
  1687.     puls    pc,x,d        restore stack and end command
  1688. *h
  1689.    
  1690. *************  breakpoint - display/enter/delete/clear
  1691. *              breakpoints
  1692.  
  1693. cbkpt    beq    cbkd        branch display of just 'b'
  1694.     lbsr    bldnum        attempt value entry
  1695.     beq    cbkadd        branch to add if so
  1696.     cmpa    #'-        ? correct delimiter
  1697.     bne    cbkerr        no, branch for error
  1698.     lbsr    bldnum        attempt delete value
  1699.     beq    cbkdle        got one, go delete it
  1700.     clr    <bkptct        was 'b -', so zero count
  1701. cbkrts    rts            end command
  1702. * delete the entry
  1703. cbkdle    bsr    cbkset        setup registers and value
  1704. cbkdlp    decb            ? any entries in table
  1705.     bmi    cbkerr        branch no, error
  1706.     cmpx    ,y++        ? is this the entry
  1707.     bne    cbkdlp        no, try next
  1708. * found, now move others up in its place
  1709. cbkdlm    ldx    ,y++        load next one up
  1710.     stx    -4,y        move down by one
  1711.     decb            ? done
  1712.     bpl    cbkdlm        no, continue move
  1713.     dec    <bkptct        decrement breakpoint count
  1714. cbkd    bsr    cbkset        setup registers and load value
  1715.     beq    cbkrts        return if none to di   ly
  1716. cbkdsl    leax    ,y++        point to next entry
  1717.     swi            display in hex
  1718.     fcb    out4hs        function
  1719.     decb            count down
  1720.     bne    cbkdsl        loop if more to do
  1721.     swi            skip to new line
  1722.     fcb    pcrlf        function
  1723.     rts            return to end command
  1724. * add new entry
  1725. cbkadd    bsr    cbkset        setup registers
  1726.     cmpb    #numbkp        ? already full
  1727.     beq    cbkerr        branch error if so
  1728.     lda    ,x        load byte to trap
  1729.     stb    ,x        try to change
  1730.     cmpb    ,x        ? changable ram
  1731.     bne    cbkerr        branch error if not
  1732.     sta    ,x        restore byte
  1733. cbkadl    decb            count down
  1734.     bmi    cbkadt        branch if done to add it
  1735.     cmpx    ,y++        ? entry already here
  1736.     bne    cbkadl        loop if not
  1737. cbkerr    lbra    cmdbad        return to error produce
  1738. cbkadt    stx    ,y        add this entry
  1739.     clr    -numbkp*2+1,y    clear optional byte
  1740.     inc    <bkptct        add one to count
  1741.     bra    cbkd        and now display all of 'em
  1742. * setup registers for scan
  1743. cbkset    ldx    <number        load value desired
  1744. cbkldr    leay    bkptbl,pcr    load start of table
  1745.     ldb    <bkptct        load entry count
  1746.     rts            return
  1747.    
  1748. *****************  encode  -  encode a postbyte
  1749.  
  1750. cencde    clr    ,-s        default to not indirect
  1751.     clrb            zero postbyte value
  1752.     leax    <conv1,pcr    start table search
  1753.     swi            obtain first character
  1754.     fcb    inchnp        function
  1755.     cmpa    #'[        ? indirect here
  1756.     bne    cen2        branch if not
  1757.     lda    #$10        set indirect bit on
  1758.     sta    ,s        save for later
  1759. cenget    swi            obtain next character
  1760.     fcb    inchnp        function
  1761. cen2    cmpa    #cr        ? end of entry
  1762.     beq    cend1        branch yes
  1763. cenlp1    tst    ,x        ? end of table
  1764.     bmi    cbkerr        branch error if so
  1765.     cmpa    ,x++        ? this the character
  1766.     bne    cenlp1        branch if not
  1767.     addb    -1,x        add this value
  1768.     bra    cenget        get next input
  1769. cend1    leax    <conv2,pcr    point at table 2
  1770.     tfr    b,a        save copy in a
  1771.     anda    #$60        isolate register mask
  1772.     ora    ,s        add in indirection bit
  1773.     sta    ,s        save back as postbyte skeleton
  1774.     andb    #$9f        clear register bits
  1775. cenlp2    tst    ,x        ? end of table
  1776.     beq    cbkerr        branch error if so
  1777.     cmpb    ,x++        ? same value
  1778.     bne    cenlp2        loop if not
  1779.     ldb    -1,x        load result value
  1780.     orb    ,s        add to base skeleton
  1781.     stb    ,s        save postbyte on stack
  1782.     leax    ,s        point to it
  1783.     swi            send out as hex
  1784.     fcb    out2hs        function
  1785.     swi            to next line
  1786.     fcb    pcrlf        function
  1787.     puls    pc,b        end of command
  1788.         
  1789. * table one defines valid input in sequence
  1790. conv1    fcb    'A,$04,'B,$05,'C,$06,'H,$01
  1791.     fcb    'H,$01,'H,$01,'H,$00,',,$00
  1792.     fcb    '-,$09,'-,$01,'S,$70,'Y,$30
  1793.     fcb    'U,$50,'X,$10,'+,$07,'+,$01
  1794.     fcb    'P,$80,'C,$00,'R,$00,'],$00
  1795.     fcb    $ff        end of table
  1796. *conv2 uses above conversion to set postbyte
  1797. *                             bit skeleton.
  1798. conv2    fdb    $1084,$1100    R,        H,R
  1799.     fdb    $1288,$1389    HH,R      HHHH,R
  1800.     fdb    $1486,$1585    A,R       B,R
  1801.     fdb    $168b,$1780    D,R       ,R+
  1802.     fdb    $1881,$1982    ,R++      ,-R
  1803.     fdb    $1a83,$828c    ,--R      HH,pcr
  1804.     fdb    $838d,$039f    HHHH,pcr  [HHHH]
  1805.     fcb    0        end of table
  1806.    
  1807. ****************************************************
  1808. *            default interrupt transfers           *
  1809. ****************************************************
  1810.  
  1811. rsrvd    jmp    [vectab+.rsvd,pcr] reserved vector
  1812. swi3    jmp    [vectab+.swi3,pcr] swi3 vector
  1813. swi2    jmp    [vectab+.swi2,pcr] swi2 vector
  1814. firq    jmp    [vectab+.firq,pcr] firq vector
  1815. irq    jmp    [vectab+.irq,pcr] irq vector
  1816. swi    jmp    [vectab+.swi,pcr] swi vector
  1817. nmi    jmp    [vectab+.nmi,pcr] nmi vector
  1818.    
  1819. ******************************************************
  1820. *             assist09 hardware vector table
  1821. *  this table is used if the assist09 rom addresses
  1822. *  the mc6809 hardware vectors.
  1823. ******************************************************
  1824.  
  1825.     org    rombeg+romsiz-16    setup hardware vectors
  1826.     fdb    rsrvd        reserved slot
  1827.     fdb    swi3        software interrupt 3
  1828.     fdb    swi2        software interrupt 2
  1829.     fdb    firq        fast interrupt request
  1830.     fdb    irq        interrupt request
  1831.     fdb    swi        software interrupt
  1832.     fdb    nmi        non-maskable interrupt
  1833.     fdb    reset        restart
  1834.    
  1835.     end    reset
  1836.  
  1837.